#include "MySock.hpp"
#include "UserManual.hpp"
#include <unistd.h>
#include "ComputerProtocol.hpp"

int main(int argc, char* argv[])
{
    if (argc != 3)
    {
        User(argv[0]);
        exit(-1);
    }

    int sock = QiHai::Sock::socket();
    if (sock < 0)
        exit(1);
    
    // 注意客户端不需要进行绑定
    // 与服务器连接
    if (!QiHai::Sock::connect(sock, argv[1], atoi(argv[2]))) exit(2);

    // 连接完毕后处理业务即可
    // std::string message;
    // while (true)
    // {
    //     std::cout << "请输入# ";
    //     std::getline(std::cin, message);
    //     QiHai::Sock::send(sock, message);

    //     if (QiHai::Sock::recv(sock, message))
    //     {
    //         std::cout << "server# ";
    //         std::cout << message << std::endl;  // 注意类似于endl和'\n'等需要刷新缓冲区的！务必记住
    //     }
    //     else break;
    // }

    std::string res;
    bool quit = false;
    while (!quit)
    {
        std::cout << "请输入(x+y):";
        ComputerData::Request r;
        std::cin >> r._x >> r._op >> r._y;
        QiHai::Sock::send(sock, r.Serialize());

        while (true)
        {
            if (QiHai::Sock::recv(sock, res))
            {
                std::string tmp = ComputerData::Decode(res);
                if (tmp.empty()) continue;

                ComputerData::Response p;
                p.Deserialization(tmp);
                if (p._code == 1) std::cout << "除零错误" << std::endl;
                else if (p._code == 2) std::cout << "未识别操作符" << std::endl;
                else if (p._code == 0) std::cout << r._x << r._op << r._y << "=" << p._result << std::endl;  // 注意类似于endl和'\n'等需要刷新缓冲区的！务必记住
                
                break;
            }
            else
            {
                quit = true;
                break;
            }
        }
        
    }
    close(sock);
    return 0;
}